package com.springboot.study.config;
// 声明当前类所在的包名，便于 Java 项目的组织与管理。
import dev.langchain4j.model.chat.ChatModel;
// 引入 LangChain4j 提供的 ChatModel 接口，用于定义聊天模型的通用行为。
import dev.langchain4j.model.openai.OpenAiChatModel;
// 引入 OpenAiChatModel 类，这是 LangChain4j 封装的 OpenAI 兼容聊天模型实现。
import org.springframework.boot.context.properties.ConfigurationProperties;
// 引入 Spring Boot 的注解，用于将配置文件中的属性绑定到 Java 类的字段上。
import org.springframework.context.annotation.Bean;
// 引入 @Bean 注解，用于将方法的返回值注册为 Spring 容器中的 Bean。
import org.springframework.context.annotation.Configuration;
// 引入 @Configuration 注解，标记当前类为 Spring 配置类。
// 该注解表示这是一个Spring的配置类，Spring容器会扫描并处理这个类，自动生成其中定义的Bean。
@Configuration
// 将配置文件中以 "langchain.community.dashscope.chat-model" 为前缀的属性绑定到本类的字段
@ConfigurationProperties(prefix = "langchain.community.dashscope.chat-model")
// Spring Boot 有一个自动绑定机制：
// 它会去找application.yml 或 application.properties 里的配置项
// 根据 prefix 前缀找到对应的配置块
// 把配置块里的值按字段名自动赋值到你的类字段上（通过 Setter 方法）
public class LLMConfig {
    // 标注该方法会返回一个Bean对象，注册到Spring容器中，方便其他组件注入使用
    /** 从 YAML 读取 api-key */
    private String apiKey;
    // 存储 API Key，用于访问模型服务（从 YAML 配置文件中读取）。
    /** 从 YAML 读取 model-name */
    private String modelName;
    // 存储模型名称，例如 "qwen-plus"（从 YAML 配置文件中读取）。
    // 如果 baseUrl 固定，也可以写在 YAML 或者直接硬编码
    private String baseUrl = "https://dashscope.aliyuncs.com/compatible-mode/v1";
    // 模型 API 的基础 URL，这里是阿里云 DashScope 的 OpenAI 兼容接口地址。
    // 生成 getter 和 setter，Spring Boot 绑定配置需要
    public String getApiKey() {
        return apiKey;
    }
    public void setApiKey(String apiKey) {
        this.apiKey = apiKey;
    }
    public String getModelName() {
        return modelName;
    }
    public void setModelName(String modelName) {
        this.modelName = modelName;
    }

    public String getBaseUrl() {
        return baseUrl;
    }

    public void setBaseUrl(String baseUrl) {
        this.baseUrl = baseUrl;
    }
    @Bean
    // 将此方法返回的对象注册到 Spring 容器，Bean 名称默认是方法名 "chatModel"。
    public ChatModel chatModel() {
        // 创建并返回一个 OpenAiChatModel 实例，使用 Builder 模式设置必要参数。
        return OpenAiChatModel.builder()
                .apiKey(apiKey)         // 设置 API Key（从配置文件注入的值）
                .modelName(modelName)   // 设置模型名称（从配置文件注入的值）
                .baseUrl(baseUrl)       // 设置 API 基础 URL
                .build();               // 构建 OpenAiChatModel 实例
    }
}
